批量修改 Git 提交中的用户名和邮箱信息
为什么要修改 Git 提交历史?
- 错误用户信息:误用个人邮箱而非公司邮箱。
 - 统一管理:为团队协作统一提交信息。
 - 隐私保护:隐藏真实用户信息。
 
一键批量修改脚本
使用 git filter-branch 修改提交历史的用户名和邮箱:
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="旧邮箱@example.com"
CORRECT_NAME="新用户名"
CORRECT_EMAIL="新邮箱@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
注意事项
- 备份仓库:操作前用 
git clone --mirror备份。 - 多人协作:修改历史会更改提交哈希,需提前通知协作者。
 - 不可逆操作:理解操作原理后再执行。
 
git filter-branch 常用功能
基本用法:
git filter-branch [选项] <filter> -- --all--all:应用到所有分支。<filter>:指定操作类型。
常用选项:
--env-filter:修改作者/提交者信息。--tree-filter:修改文件内容或删除文件(较慢)。--index-filter:高效修改暂存区文件。--commit-filter:自定义提交信息。--tag-name-filter:更新标签。--prune-empty:删除空提交。
示例
修改用户信息:
git filter-branch --env-filter ' OLD_EMAIL="旧邮箱@example.com" CORRECT_NAME="新用户名" CORRECT_EMAIL="新邮箱@example.com" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' -- --all删除文件:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch .env' -- --all
替代工具
git filter-repo:比 git filter-branch 更快、更易用,适合大规模仓库清理。
常见问题
修改历史会影响安全性吗? 不会直接影响,但可能导致同步问题,需备份并通知团队。
其他开发者如何同步? 需重新拉取代码,可能需解决冲突。
其他修改方法?
git commit --amend:修改最近提交。git rebase -i:交互式修改多条提交。
管理 Git 用户信息提示
- 全局配置:
git config --global user.name "Your Name" git config --global user.email "your_email@example.com" - 项目级配置:在 
.git/config设置本地用户信息。 - 检查提交信息:提交前确认用户名和邮箱。
 

Comments